Jeg har på det seneste et par gange på Twitter (og dermed også Facebook) brokket mig lidt over login systemer på det seneste. Noget tyder i hvert fald på, at det der burde være en rimelig og ansvarlig politik og “best practice” politik, overhovedet ikke følges - selv når der er tale om nye (og prestigefyldte) websites.
Note: Det følgende er skrevet i håbet om at være nogenlunde forståeligt af alle, og der er derfor bevidst lavet nogle simplifikationer og udeladt detaljer - f.eks. omkring “salt” af hash algoritmer. Jeg håber trods dette, at den har værdi og giver mening.
Der er 2 åbenlyse faresignaler, man bør være opmærksom på, hvis man har med online login-systemer at gøre:
- Man bør aldrig nogensinde blive tvunget til at have en maksimal længde på passwords (i hvert fald ikke på under 40-50 tegn).
- Et website bør aldrig nogensinde kunne gensende dig dit password via en “glemt kodeord” funktion.
Ad 1) I “gamle dage” da man lavede de første websites med logins, der skulle det sikkert bare gå stærkt, og sikkerhed var typisk noget, der blev kigget på “når man fik tid”. Derfor var der mange sites, som startede med en tabel i en database, der ret beset bestod af et felt til brugernavn og et til passwordet - matchede de to med det, som brugeren tastede ind, blev han godkendt.
Udover det åbenlyst uheldige i at enhver udvikler, webmaster og andre med adgang til denne database, uden videre vil kunne udgive sig for at være brugeren, så er der også det problem, at hvis man har “indbrud” på serveren (populært sagt, at den bliver “hacket”), så vil de ubudne gæster også kunne skaffe sig en kopi af samtlige brugernavne og tilhørende passwords. Det skete f.eks. for Yahoo! i sommers, hvor over 450.000 brugernavne og kodeord (i klar tekst) blev kopieret af folk, der havde fundet en sikkerhedsbrist i et af deres sites.
Når man har brug for kunne genkende en bruger, så er det ikke brugerens password, man har brug for at gemme - det er en sikkerhed for at brugeren har tastet det rigtige password, og her kan matematikken hjælpe.
Der findes nemlig såkaldte “hash funktioner”, som er en slags en-vejs kryptering. Man giver et kodeord til en hash funktion, og den returnerer altid det samme samme. Svaret har altid samme længde, og der bør ikke findes nogen mulig måde, at komme fra svaret, der er kommet ud af Hash funktionen tilbage til det oprinelige kodeord.
Laver man login systemer i dag, så er det resultatet af hash funktionen man gemmer, ikke brugerens kodeord. Med hash funktionen(*) kan ingen ud fra den gemte tekst som udgangspunkt se brugerens kodeord (og dermed misbruge det), men vi kan stadigt være helt sikre på, at brugeren kender kodeordet, der hører til brugerens konto.
Ad 2) Hvis websitet er i stand til at sende eller på anden måde udlevere dit kodeord, så forudsætter denne handling, at det er gemt i klar-tekst (eller i det mindste på en sådan måde, at det kan bruges tilbage til klar-tekst).
Givet mange har for vane, at genbruge samme brugernavn og kodeord igen og igen på tværs af mange sites - twitter, facebook og mange, mange andre steder, så er det, at ens brugernavn og kodeord ligger i klar-tekst på et tilfældigt site, ikke kun et problem for det ene site, hvis de som Yahoo! har digitalt indbrud og fremmede får en kopi af brugerkonti.
Websites, der har lavet sikkerheden rigtigt, har typisk også en “glemt kodeord” procedure. Den fungerer typisk ved at man enten får udstedt et nyt midlertidigt kodeord og får dette via mail, telefon eller lignende (og ofte tvinges til at skifte dette ved første brug, så ingen efterfølgende har mulighed for at kende dit personlige kodeord) - eller også sender de et link med en lang kode i, som giver adgang til at lave et nyt kodeord.
Lidt om hash funktioner
Der findes mange forkellige hash funktioner. Nogle af de mest kendte er CRC32, MD5 og SHA1. Funktionerne bruges ikke kun i forbindelse med passwords, men også i forbindelse med “checksummer”, så man f.eks. kan lave en “hash” af to tekster, og hvis den bliver ens, så er teksterne antageligvis ens.
En hash kvalitet måles ud fra flere forskellige parametre, blandt andet hvor tung den er at lave for serveren, hvor tilfældigt resultatet er i forhold til hvad man giver den af input (om det er muligt at se mønstre i det, der kommer ud) og hvor lang den hash (resultat), der resulterer i.